package com.trex.modules.utils;


public class MoneyUtils {
	/** 大写数字 */
	private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

	/** 整数部分的单位 */
	private static final String[] IUNIT = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" };

	/** 小数部分的单位 */
	private static final String[] DUNIT = { "角", "分", "厘" };

	private MoneyUtils() {
		throw new IllegalStateException("Utility class");
	}

	/**
	 * 得到大写金额。
	 */
	public static String toChinese(String str) {
		str = str.replace(",", "");// 去掉","
		String integerStr;// 整数部分数字
		String decimalStr;// 小数部分数字
		// 初始化：分离整数部分和小数部分
		if (str.indexOf(".") >=0) {
			integerStr = str.substring(0, str.indexOf("."));
			decimalStr = str.substring(str.indexOf(".") + 1);
		} else if (str.indexOf(".") == 0) {
			integerStr = "";
			decimalStr = str.substring(1);
		} else {
			integerStr = str;
			decimalStr = "";
		}
		// integerStr去掉首0，不必去掉decimalStr的尾0(超出部分舍去)
		if (!integerStr.equals("")) {
			integerStr = Long.toString(Long.parseLong(integerStr));
			if (integerStr.equals("0")) {
				integerStr = "";
			}
		}
		// overflow超出处理能力，直接返回
		if (integerStr.length() > IUNIT.length) {
			return str;
		}

		int[] integers = toArray(integerStr);// 整数部分数字
		int[] decimals = toArray(decimalStr);// 小数部分数字
		String integer = getChineseInteger(integers);
		String decimal = getChineseDecimal(decimals);
		return integer + (decimal.equals("") ? "整" : decimal);
	}

	/**
	 * 整数部分和小数部分转换为数组，从高位至低位
	 */
	private static int[] toArray(String number) {
		int[] array = new int[number.length()];
		for (int i = 0; i < number.length(); i++) {
			array[i] = Integer.parseInt(number.substring(i, i + 1));
		}
		return array;
	}

	/**
	 * 得到中文金额的整数部分。
	 */
	private static String getChineseInteger(int[] integers) {
		StringBuilder chineseInteger = new StringBuilder();
		int length = integers.length;
		for (int i = length - 1; i >= 0; i--) {
			int n = integers[i];
			int ui = length - 1 - i;
			if (0 == n) {
				if (0 == ui % 4) chineseInteger.insert(0, IUNIT[ui]);
				else chineseInteger.insert(0, n);
			} else {
				chineseInteger.insert(0, IUNIT[ui]).insert(0, NUMBERS[n]);
			}
		}
		return chineseInteger.toString().replaceAll("0{3}[兆亿万]", "0").replaceAll("0+([兆亿万元])", "$1").replaceAll("0+", "零");
	}

	/**
	 * 得到中文金额的小数部分。
	 */
	private static String getChineseDecimal(int[] decimals) {
		StringBuilder chineseDecimal = new StringBuilder();
		for (int i = 0; i < decimals.length; i++) {
			// 舍去3位小数之后的
			if (i == 3)
				break;
			chineseDecimal.append(decimals[i] == 0 ? "0" : (NUMBERS[decimals[i]] + DUNIT[i]));
		}
		return chineseDecimal.toString();
	}

	/**
	 * MoneyUtil moneyUtil = new MoneyUtil();
	 * System.out.println(MoneyUtils.toChinese("5000.23"));
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		throw new UnsupportedOperationException();
	}
}
